import java.util.LinkedList;
import java.util.Queue;

/**
 * Created by zhourh on 2018/5/24.
 *
 * 将一个按照升序排列的有序数组，转换为一棵高度平衡二叉搜索树。

 本题中，一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

 示例:

 给定有序数组: [-10,-3,0,5,9],

 一个可能的答案是：[0,-3,9,-10,null,5]，它可以表示下面这个高度平衡二叉搜索树：

 0
 / \
 -3   9
 /   /
 -10  5
 *
 * 递归&二分
 */
public class ConvertSortedArrayToBinarySearchTree {

    public static void main(String[] args) {
        System.out.println(TreeNode.treeNodeToString(new ConvertSortedArrayToBinarySearchTree().sortedArrayToBST(new int[0])));

        System.out.println(TreeNode.treeNodeToString(new ConvertSortedArrayToBinarySearchTree().sortedArrayToBST(new int[]{-10,-3,0,5,9})));
        System.out.println(TreeNode.treeNodeToString(new ConvertSortedArrayToBinarySearchTree().sortedArrayToBST(new int[]{0,1,2,3,4,5})));
    }

    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBST(nums, 0, nums.length);
    }

    public TreeNode sortedArrayToBST(int[] nums, int start, int end) {
        if (nums == null || start >= end) {
            return null;
        }

        int mid = (end + start) / 2;
        TreeNode rootTreeNode = new TreeNode(nums[mid]);
        rootTreeNode.left = sortedArrayToBST(nums, start, mid);
        rootTreeNode.right = sortedArrayToBST(nums, mid + 1, end);

        return rootTreeNode;
    }


}
